#include <stdio.h>
#include <stdlib.h>

typedef struct ListNode
{
	int data;
	struct ListNode *next;
}ListNode;

int IsEmpty(ListNode *);
void InitList(ListNode *);
int GetLength(ListNode *);
void PrintList(ListNode *);
void Delete(ListNode *,int);
void DestroyList(ListNode *);
int GetElement(ListNode *,int);
void Insert(ListNode *, int,int); 
int GetElementIndex(ListNode *,int);
void CreatList(ListNode *,int *,int);

int main()
{
	int arr[4]={1,2,3,4};
	int arrlen=sizeof(arr)/sizeof(arr[0]);
	ListNode L;
	InitList(&L);
	CreatList(&L,arr,arrlen);
	IsEmpty(&L);
	GetLength(&L);
	GetElement(&L,2);
	GetElementIndex(&L,4);
	Delete(&L,3);
	Insert(&L,2,5);
	PrintList(&L);
}

void InitList(ListNode *L)
{
	L=(ListNode *)malloc(sizeof(ListNode));
	L->next=NULL;
}
void CreatList(ListNode *L,int arr[],int arrlen)
{
	ListNode *s;
	ListNode *r;
	r=L;
	for(int i=0;i<arrlen;i++)
	{
		 s=(ListNode *)malloc(sizeof(ListNode));
		 s->data=arr[i];
		 r->next=s;
		 r=s;
	}
	r->next=NULL;
}
void DestroyList(ListNode *L)
{
	ListNode *pre=L;
	ListNode *p=L->next;
	if(p!=NULL)
	{
		free(pre);
		pre=p;
		p=pre->next;
	}
	free(pre);
}
int IsEmpty(ListNode *L)
{
	return (L->next==NULL?1:0);
}
int GetLength(ListNode *L)
{
	int len=0;
	ListNode *p=L;
	while(p->next!=NULL)
	{
		p=p->next;
		len++;
	}
	return len;
}
void PrintList(ListNode *L)
{
	ListNode *p=L->next;
	while(p!=NULL)
	{
		printf("%d\n",p->data);
		p=p->next;
	}
}
int GetElement(ListNode *L,int index)
{
	int i=0;
	ListNode *p=L;
	while(i<index&&p!=NULL)
	{
		i++;
		p=p->next;
	}
	return (p==NULL)?0:(p->data);
}
int GetElementIndex(ListNode *L,int value)
{
	int index=1;
	ListNode *p=L->next;
	while(p!=NULL&&p->data!=value)
	{
		p=p->next;
		index++;
	}
	return (p==NULL)?0:index;
}
void Insert(ListNode *L, int index ,int value)
{
	int i=0;
	ListNode *p=L;
	ListNode *s;
	while(i<index-1&&p!=NULL)
	{
		i++;
		p=p->next;
	}
	if(p!=NULL)
	{
		s=(ListNode *)malloc(sizeof(ListNode));
		s->data=value;
		s->next=p->next;
		p->next=s;
	}
}
void Delete(ListNode *L,int index)
{
	int i=0;
	ListNode *p=L;
	ListNode *q;
	while(i<index-1&&p!=NULL)
	{
		i++;
		p=p->next;
	}
	if(p!=NULL)
	{
		q=p->next;
		if(q!=NULL)
		{
			p->next=q->next;
			free(q);
		}
	}
}
